package cn.liulingfengyu.behavioralpatterns.templatemethodpattern;

/**
 * 模板方法模式示例
 */
public class TemplateMethodPatternDemo {
    public static void main(String[] args) {
        // 使用具体子类A
        AbstractClass concreteA = new ConcreteClassA();
        concreteA.templateMethod();

        System.out.println("-----------------");

        // 使用具体子类B
        AbstractClass concreteB = new ConcreteClassB();
        concreteB.templateMethod();
    }
}

/**
 * 抽象类，定义模板方法和抽象方法
 */
abstract class AbstractClass {
    /**
     * 模板方法，定义算法骨架
     */
    public final void templateMethod() {
        System.out.println("模板方法开始执行...");
        operation1();
        operation2();
        System.out.println("模板方法执行结束。");
    }

    /**
     * 具体方法，可以在模板方法中直接使用
     */
    protected void operation1() {
        System.out.println("抽象类中的具体方法 operation1");
    }

    /**
     * 抽象方法，由子类实现
     */
    protected abstract void operation2();
}

/**
 * 具体子类A，实现抽象方法
 */
class ConcreteClassA extends AbstractClass {
    @Override
    protected void operation2() {
        System.out.println("具体子类A实现的抽象方法 operation2");
    }
}

/**
 * 具体子类B，实现抽象方法
 */
class ConcreteClassB extends AbstractClass {
    @Override
    protected void operation2() {
        System.out.println("具体子类B实现的抽象方法 operation2");
    }
}